package org.netmelody.croquet; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import org.netmelody.croquet.model.Ball; import org.netmelody.croquet.model.BallInPlay; import org.netmelody.croquet.model.Game; import org.netmelody.croquet.model.Strike; import org.netmelody.croquet.model.Stroke; import org.netmelody.croquet.model.Team; import org.netmelody.croquet.physics.StrokeEnactor; import org.netmelody.croquet.physics.Transition; import org.netmelody.croquet.renderer.PitchView; import org.netmelody.croquet.renderer.TransitionProjector; public final class CroquetPro { private final Game game = new Game(new Team("Team 1"), new Team("Team2")); private final StrokeEnactor enactor = new StrokeEnactor(game.court); private final List<TransitionProjector> projectors = new ArrayList<TransitionProjector>(); private List<BallInPlay> ballPositions = game.ballPositions; public CroquetPro() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final PitchView view = new PitchView(game.court); projectors.add(new TransitionProjector(view)); final JFrame frame = new JFrame("Testaroonie"); frame.setLayout(new BorderLayout()); frame.add(view, "Center"); frame.pack(); view.draw(ballPositions); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); showControlsFrame(); } }); } public static void main(String[] args) throws Exception { new CroquetPro(); } private void showControlsFrame() { final JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); final Ball[] possibilities = {Ball.BLUE, Ball.BLACK, Ball.YELLOW, Ball.RED}; final JSpinner angleSpinner = new JSpinner(new SpinnerNumberModel(0.0, 0.0, 360.0, 1.0)); final JSpinner powerSpinner = new JSpinner(new SpinnerNumberModel(0.0, 0.0, 20.0, 1.0)); final JComboBox<Ball> ballChooser = new JComboBox<Ball>(possibilities); final JButton goButton = new JButton("Go!"); final JPanel panel = new JPanel(); panel.add(new JLabel("angle:")); panel.add(angleSpinner); panel.add(new JLabel("power:")); panel.add(powerSpinner); panel.add(new JLabel("ball:")); panel.add(ballChooser); panel.add(goButton); goButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { goButton.setEnabled(false); final Ball ball = ballChooser.getItemAt(ballChooser.getSelectedIndex()); final Double power = (Double)powerSpinner.getValue(); final float angle = (float)Math.toRadians((Double)angleSpinner.getValue()); makeShot(goButton, Stroke.standard(ball, new Strike(angle, power.floatValue()))); } }); frame.add(panel, "Center"); frame.pack(); frame.setVisible(true); } private void makeShot(final JButton goButton, final Stroke stroke) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final Transition t = enactor.makeStroke(ballPositions, stroke); for (TransitionProjector projector : projectors) { projector.project(t); ballPositions = t.finalPositions(); } goButton.setEnabled(true); } }); } }